﻿Type.registerNamespace("MoniMisi2");

MoniMisi2.Grilla = function(element) {
    MoniMisi2.Grilla.initializeBase(this, [element]);
    this.IDDatos = null;
    this.Filas = null;
    this.DelCrear = Function.createDelegate(this, this.Crear);
    this.DelRuedita = Function.createDelegate(this, this.Ruedita);
    this.DelTeclado = Function.createDelegate(this, this.Teclado);
    this.DelSeleccionar = Function.createDelegate(this, this.Seleccionar);
    this.DelElegir = Function.createDelegate(this, this.Elegir);
    this.DelSelect = Function.createDelegate(this, function(evento) { return false });
    this.DelMouseMove = Function.createDelegate(this, this.Ascensorista);
    this.DelMouseDown = Function.createDelegate(this, this.ActivarMouseMove);
    this.DelMouseUp = Function.createDelegate(this, this.DesactivarMouseMove);
    this.DelOrdenar = Function.createDelegate(this, this.OrdenarColumna);
    this.DelEncontrado = null;
    this.DelFin = null;
    this.DelPrincipio = null;
    this.ControlCreadoArgs = function(pControl) { this.Control = pControl };
    this.FilaCreadaArgs = function(pFila) { this.Fila = pFila };
    this.PoblandoArgs = function(pColumna, pControl, pValor) { this.Columna = pColumna; this.Control = pControl; this.Valor = pValor; this.Cancelar = false };
    this.ElegidoArgs = function(pRegistro) { this.Registro = pRegistro };
    this.SeleccionadoArgs = function(pRegistro) { this.Registro = pRegistro };
    this.EncontradoArgs = function(pRegistro) { this.Registro = pRegistro };
    this.Campos = null;
    this.Datos = null;
    this.FiliaInicial = 0;
    this.ClaseFila = null;
    this.FilaAnterior = null;
    this.Limites = { Desde: 0, Hasta: 0 };
    this.ParamEncontrado = null;
    this.ParamFin = null;
    this.ParamPrincipio = null;
    this.Ascensor = null;
    this.CeldaScroll = null;
    this.CeldaInfo = null;
    this.SubIndice = 0;
    this.Flechita = null;
    this.Buscado = "";
    this.UltimaFila = null;
    this.CeldasOrden = [];
    this.IndiceElemento = null

}

MoniMisi2.Grilla.prototype = {
    initialize: function() {
        MoniMisi2.Grilla.callBaseMethod(this, 'initialize');
        Sys.Application.add_load(this.DelCrear);
        this.Flechita = document.createElement("div");

        if (this.CeldaScroll != null) {
            $addHandler(document, "mousedown", this.DelMouseDown);
            $addHandler(document, "selectstart", this.DelSelect);
            this.CeldaScroll.style.fontSize = "1px"
            this.CeldaScroll.style.verticalAlign = "top"
            this.CeldaScroll.style.textAlign = "left"
            this.CeldaScroll.style.backgroundColor = "#EEEEEE"
            this.CeldaScroll.style.border = "inset 3px white"
            this.Ascensor = document.createElement("div")
            this.Ascensor.id = this.CeldaScroll.id + "_Ascensor";
            this.Ascensor.style.width = this.CeldaScroll.style.width;
            this.Ascensor.style.border = "outset 3px white"
            this.Ascensor.style.backgroundColor = "#DDDDDD"
            this.Ascensor.style.cursor = "pointer";
            this.Ascensor.style.fontSize = "1px"
            this.CeldaScroll.appendChild(this.Ascensor);
            this.CeldaScroll.style.paddingTop = "0px"
        }
    },
    dispose: function() {
    },
    RefrescarAscensor: function() {
        if (this.CeldaScroll != undefined) {
            var Factor = this.CeldaScroll.clientHeight / this.Datos.Indices[this.Datos.IndiceActual].length;
            var Pad = Factor * this.Datos.PaginaActual;
            if (Pad < this.CeldaScroll.clientHeight - this.Ascensor.offsetHeight - 1) {
                this.CeldaScroll.style.paddingTop = Pad + "px";
            }
        }
    },
    ActivarMouseMove: function(e) {
        if (!this.Datos.Esperando) {
            if (e.target === this.Ascensor || e.target === this.CeldaScroll) {
                $addHandler(document, "mousemove", this.DelMouseMove);
                $addHandler(document, "mouseup", this.DelMouseUp);
                e.preventDefault();
            }
        }
    },

    DesactivarMouseMove: function(e) {
        $removeHandler(document, "mousemove", this.DelMouseMove);
        $removeHandler(document, "mouseup", this.DelMouseUp);
        if (this.CeldaInfo != null) { this.CeldaInfo.innerHTML = "" };
        this.DelEncontrado = Function.createDelegate(this, this.PaginaEncontrada);
        this.Datos.add_Encontrado(this.DelEncontrado)
        this.Datos.Arribar({ Pagina: this.SubIndice })
    },

    PaginaEncontrada: function(sender, e) {
        this.Datos.remove_Encontrado(this.DelEncontrado);
        this.Poblar()
        this.Buscado = "";
        this.Buscar(this.Buscado);
        this.FilaAnterior.className = this.ClaseFila;
        this.FilaAnterior = this.get_element();
        this.Seleccionar({ target: this.FilaAnterior })
    },

    Ascensorista: function(e) {
        var Fun = new MoniMisi2.Funciones();
        var PosCelda = Fun.ObtenerPosicionAbsoluta(this.CeldaScroll, false);
        var Diferencia = this.CeldaScroll.clientHeight - (e.clientY - PosCelda.y) - this.Ascensor.offsetHeight - 1;
        var Pad = (e.clientY - PosCelda.y) >= 0 ? (e.clientY - PosCelda.y) : 0;
        var Factor = this.CeldaScroll.clientHeight / this.Datos.Indices[this.Datos.IndiceActual].length
        this.Ascensor.style.height = (Factor < 3 ? 3 : Factor) + "px";
        if (Diferencia >= 0) { this.CeldaScroll.style.paddingTop = Pad + "px"; }
        this.SubIndice = Math.min(parseInt(Pad / Factor, 10), this.Datos.Indices[this.Datos.IndiceActual].length - 1);
        if (this.CeldaInfo != null) { this.CeldaInfo.innerHTML = "<div></div>" + this.Datos.Indices[this.Datos.IndiceActual][this.SubIndice].C; }
    },

    Multiplicar: function(pFilaOrig, pFilas) {
        pFilaOrig.__Orden = 0;
        var Proximo = pFilaOrig.nextSibling;
        for (var n = 0; n < pFilas - 1; n += 1) {
            var NuevaFila = pFilaOrig.cloneNode(true);
            NuevaFila.__Orden = n + 1
            if (Proximo == undefined) {
                pFilaOrig.parentNode.appendChild(NuevaFila)
            } else {
                pFilaOrig.parentNode.insertBefore(NuevaFila, Proximo);
            }
        };
    },

    ReLeer: function(e) {
        if (!this.Datos.Esperando) {
            this.Datos.Limpiar();
            this.DelEncontrado = Function.createDelegate(this, this.OrdenEncontrado)
            this.DelFin = Function.createDelegate(this, this.FinEncontrado)
            this.Datos.add_Encontrado(this.DelEncontrado)
            this.Datos.add_Fin(this.DelFin)
            this.Datos.Arribar()
        }
    },

    OrdenarColumna: function(e) {
        if (!this.Datos.Esperando) {
            this.Buscado = "";
            this.Buscar(this.Buscado);
            this.DelEncontrado = Function.createDelegate(this, this.OrdenEncontrado)
            this.Datos.add_Encontrado(this.DelEncontrado)
            if (this.Flechita.parentNode != undefined) { this.Flechita.parentNode.removeChild(this.Flechita) }
            e.target.appendChild(this.Flechita)
            this.Datos.Arribar({ Orden: e.target.Indice })
        }
    },
    OrdenEncontrado: function() {
        this.Datos.remove_Encontrado(this.DelEncontrado)
        this.Datos.remove_Fin(this.DelFin);
        this.Poblar();
        this.FilaAnterior.className = this.ClaseFila;
        this.FilaAnterior = this.get_element();
        this.Seleccionar({ target: this.FilaAnterior })
    },
    FinEncontrado: function() {
        this.Datos.remove_Encontrado(this.DelEncontrado)
        this.Datos.remove_Fin(this.DelFin);
        this.Refrescar()
    },
    Crear: function() {
        this.Datos = Sys.Application.findComponent(this.IDDatos)
        this.DelEncontrado = Function.createDelegate(this, this.EncontradoCrear);
        this.Datos.add_Encontrado(this.DelEncontrado);
        this.Datos.add_Fin(this.DelEncontrado);
        this.Datos.Arribar();
    },
    EncontradoCrear: function() {
        this.Datos.remove_Encontrado(this.DelEncontrado);
        this.Datos.remove_Fin(this.DelEncontrado);
        this.Campos = {};
        for (var Prop in this.Datos.Estructura) {
            this.Campos[Prop] = this.Datos.Estructura[Prop]
        };
        //this.Campos = this.Datos.Estructura
        this.UltimaFila = this.Filas
        //Asigno eventos a columnas de ordenamiento
        var Indice = 0
        for (var Prop in this.Campos) {
            var CeldaOrden = document.getElementById(this.IDDatos + "_Orden_" + Prop);
            if (CeldaOrden != undefined) {
                $addHandler(CeldaOrden, "click", this.DelOrdenar);
                CeldaOrden.Indice = this.Datos.IndiceOrden(Prop);
                //if (Indice == 0) { CeldaOrden.appendChild(this.Flechita) }
                if (CeldaOrden.Indice == this.Datos.IndiceActual) { CeldaOrden.appendChild(this.Flechita) }
                this.CeldasOrden.push(CeldaOrden);
                Indice += 1;
            }
        }
        //Paso los controles al array Campos
        var Todos = document.getElementsByTagName("body")[0].getElementsByTagName("*")
        for (var n = 0; n < Todos.length; n += 1) {
            //var IdDato = Todos[n].id.split("_").length >= 2 ? Todos[n].id.split("_")[0] : "";
            //var NombreProp = Todos[n].id.split("_").length >= 2 ? Todos[n].id.replace(IdDato + "_", "") : "";
            //if (IdDato == this.IDDatos) {
            if (Todos[n].id.indexOf(this.IDDatos + "_") == 0) {
                var NombreProp = Todos[n].id.replace(this.IDDatos + "_", "");
                if (this.Campos[NombreProp] != undefined) {
                    if (this.Campos[NombreProp]["Controles"] == undefined) {
                        this.Campos[NombreProp] = { Controles: new Array() };
                    }
                    this.Campos[NombreProp].Controles.push(Todos[n])
                }
            }
        };
        //Asigno Id
        for (var n = 1; n < this.Filas; n += 1) {
            for (var Prop in this.Campos) {
                if (this.Campos[Prop] != undefined) {
                    if (this.Campos[Prop].Controles != undefined) {
                        this.Campos[Prop].Controles[n].id += n.toString();
                        var e = new this.ControlCreadoArgs(this.Campos[Prop].Controles[n])
                        var h = this.get_events().getHandler('ControlCreado');
                        if (h) { h(this, e) }
                    }
                }
            }
        }
        //Asigno Eventos
        this.IndiceElemento = (this.get_element().tagName == 'TR' ? 'rowIndex' : 'cellIndex');
        //var Tabla = this.get_element().parentNode
        var Tabla = this.get_element().parentNode
        Tabla.tabIndex = 0;
        $addHandler(Tabla, "mousewheel", this.DelRuedita);
        $addHandler(Tabla, "DOMMouseScroll", this.DelRuedita);
        $addHandler(Tabla, "keydown", this.DelTeclado);
        var PrimeraFila = this.get_element()
        this.ClaseFila = PrimeraFila.className;
        this.Limites.Desde = PrimeraFila[this.IndiceElemento];
        this.Limites.Hasta = PrimeraFila[this.IndiceElemento] + this.Filas - 1;
        for (var Fila = 0; Fila < this.Filas; Fila += 1) {
            $addHandler(PrimeraFila, "click", this.DelSeleccionar);
            $addHandler(PrimeraFila, "dblclick", this.DelElegir);
            var e = new this.FilaCreadaArgs(PrimeraFila)
            var h = this.get_events().getHandler('FilaCreada');
            if (h) { h(this, e) }
            PrimeraFila = PrimeraFila.nextSibling;
        }
        this.Poblar();
        this.FilaAnterior = this.get_element();
        this.Seleccionar({ target: this.FilaAnterior })
        if (this.CeldaScroll != null) {
            var Factor = this.CeldaScroll.offsetHeight / this.Datos.Indices[this.Datos.IndiceActual].length
            this.Ascensor.style.height = (Factor < 3 ? 3 : Factor) + "px";
        }
    },

    Poblar: function() {
        if (this.Datos.Registro != null) {
            this.DelEncontrado = Function.createDelegate(this, this.EncontradoPoblar);
            this.DelFin = Function.createDelegate(this, this.FinPoblar);
            this.Datos.add_Encontrado(this.DelEncontrado);
            this.Datos.add_Fin(this.DelFin);
            this.ParamEncontrado = { x: 0 };
            this.EncontradoPoblar(this, this.Datos.Registro);
            var Puntero = this.Datos.Puntero
            for (var x = 1; x < this.Filas; x += 1) {
                this.ParamEncontrado = { x: x };
                this.Datos.Avanzar()
            }
            this.Datos.IrA(Puntero)
            this.Datos.remove_Encontrado(this.DelEncontrado);
            this.Datos.remove_Fin(this.DelFin);
            this.RefrescarAscensor();
        } else {
            for (var x = 1; x < this.Filas; x += 1) {
                this.ParamEncontrado = { x: x };
                var e = new this.EncontradoArgs(this.Datos.RegistroBlanco(true));
                this.EncontradoPoblar(null, e);
            }
            this.ParamEncontrado = { x: 0 };
            this.FinPoblar(this, null);

        }
    },

    EncontradoPoblar: function(sender, e) {
        this.UltimaFila = this.Filas;
        for (var Prop in this.Campos) {
            if (this.Campos[Prop] != undefined) {
                if (this.Campos[Prop].Controles != undefined) {
                    var Nombre = Prop.split("__");
                    var Valor = e[Nombre[0]];
                    if (Valor != null) {
                        for (var n = 1; n < Nombre.length; n += 1) {
                            Valor = Valor[Nombre[n]]
                        };
                    }

                    var ep = new this.PoblandoArgs(Prop, this.Campos[Prop].Controles[this.ParamEncontrado.x], Valor);
                    var h = this.get_events().getHandler('Poblando');
                    if (h) { h(this, ep) }
                    if (!ep.Cancelar) {
                        this.Asignar(Prop, this.Campos[Prop].Controles[this.ParamEncontrado.x], e);
                    }
                }
            }
        }
    },
    FinPoblar: function(sender, e) {
        if (this.UltimaFila == this.Filas) { this.UltimaFila = this.ParamEncontrado.x }
        for (var Prop in this.Campos) {
            if (this.Campos[Prop] != undefined) {
                if (this.Campos[Prop].Controles != undefined) {
                    var ep = new this.PoblandoArgs(Prop, this.Campos[Prop].Controles[this.ParamEncontrado.x], null);
                    var h = this.get_events().getHandler('Poblando');
                    if (h) { h(this, ep) }
                    if (!ep.Cancelar) {
                        this.Asignar(Prop, this.Campos[Prop].Controles[this.ParamEncontrado.x], null);
                    }
                }
            }
        }
    },
    Refrescar: function() {
        var Puntero = this.Datos.Puntero;
        this.Datos.Retroceder({ Salto: this.FilaAnterior[this.IndiceElemento] - this.Limites.Desde });
        this.Poblar()
        this.Datos.IrA(Puntero);

    },

    RePosicionar: function() {
        this.Poblar();
        this.FilaAnterior.className = this.ClaseFila;
        this.FilaAnterior = this.get_element();
        this.Seleccionar({ target: this.FilaAnterior });
    },

    Asignar: function(pNombre, pControl, pRegistro) {
        var Nombre = pNombre.split("__");
        var Valor = pRegistro == null ? null : pRegistro[Nombre[0]];
        if (Valor != null) {
            for (var n = 1; n < Nombre.length; n += 1) {
                Valor = Valor[Nombre[n]]
            };
        }
        //var Valor = pRegistro == null ? null : pRegistro[Nombre[0]];
        //if (Nombre.length == 2) { Valor = Valor[Nombre[1]] }
        if (pControl.control != undefined) {
            pControl.control.set_value(Valor);
        } else {
            if ($find(pControl.id) != undefined) {
                $find(pControl.id).set_value(Valor);
            } else {
                switch (pControl.tagName) {
                    case 'IMG':
                        pControl.src = Valor ? Valor : 'none';
                        break;
                    case 'A':
                        pControl.href = Valor ? Valor : '';
                        break;
                    case 'INPUT':
                        switch (pControl.type) {
                            case 'radio': case 'checkbox':
                                pControl.checked = Valor;
                                break;
                            case 'submit':
                                pControl.src = Valor
                                break;
//                            case 'text':
//                                pControl.value = Valor;
//                                break;
                            default:
                                pControl.value = Valor;
                                break;
                        }
                        break;
                    default:
                        if (pControl.value != undefined) {
                            pControl.value = Valor;
                        } else {
                            if (Valor == null) { Valor = "" }
                            if (typeof (Valor) == "object") { if (Valor.constructor.__typeName == "Date") { Valor = Valor.toLocaleDateString() } }
                            pControl.innerHTML = Valor;
                        }

                        break;
                }
            }
        }
    },

    Avanzar: function(pSalto) {
        if (this.FilaAnterior[this.IndiceElemento] < this.Limites.Hasta) {
            if (pSalto == 1) {
                this.Seleccionar({ target: this.FilaAnterior.nextSibling })
            } else {
                this.Seleccionar({ target: this.FilaAnterior.parentNode.children[this.Limites.Hasta] })
            }
        } else {
            this.DelEncontrado = Function.createDelegate(this, this.EncontradoAvanzar);
            this.DelFin = Function.createDelegate(this, this.FinAvanzar);
            this.Datos.add_Encontrado(this.DelEncontrado);
            this.Datos.add_Fin(this.DelFin);
            this.ParamFin = { Salto: pSalto };
            this.Datos.Avanzar({ Salto: pSalto });
        }
    },
    EncontradoAvanzar: function(sender, e) {
        this.Datos.remove_Encontrado(this.DelEncontrado);
        this.Datos.remove_Fin(this.DelFin);
        var Puntero = this.Datos.Puntero;
        this.Datos.Retroceder({ Salto: this.Filas - 1 });
        this.Poblar()
        this.Datos.IrA(Puntero);
        this.InvocarSeleccionado()

    },
    FinAvanzar: function(sender, e) {
        this.Datos.remove_Encontrado(this.DelEncontrado);
        this.Datos.remove_Fin(this.DelFin);
        if (this.ParamFin.Salto != 1) {
            var Puntero = this.Datos.Puntero;
            this.Datos.Retroceder({ Salto: this.Filas - 1 });
            this.Poblar()
            this.Datos.IrA(Puntero);
        };
    },
    Retroceder: function(pSalto) {
        if (this.FilaAnterior[this.IndiceElemento] > this.Limites.Desde) {
            if (pSalto == 1) {
                this.Seleccionar({ target: this.FilaAnterior.previousSibling })
            } else {
                this.Seleccionar({ target: this.FilaAnterior.parentNode.children[this.Limites.Desde] });
            }
        } else {
            this.DelEncontrado = Function.createDelegate(this, this.EncontradoRetroceder);
            this.DelPrincipio = Function.createDelegate(this, this.PrincipioRetroceder);
            this.Datos.add_Encontrado(this.DelEncontrado);
            this.Datos.add_Principio(this.DelPrincipio);
            this.ParamPrincipio = { Salto: pSalto };
            this.Datos.Retroceder({ Salto: pSalto })
        }
    },
    EncontradoRetroceder: function() {
        this.Datos.remove_Encontrado(this.DelEncontrado);
        this.Datos.remove_Principio(this.DelPrincipio);
        this.Poblar()
        this.InvocarSeleccionado()
    },
    PrincipioRetroceder: function() {
        this.Datos.remove_Encontrado(this.DelEncontrado);
        this.Datos.remove_Principio(this.DelPrincipio);
        if (this.ParamPrincipio.Salto != 1) {
            this.Poblar()
        };
    },


    Seleccionar: function(e) {
        var Fila;
        if (e.target == null) { Fila = e.rawEvent.fromElement } else { Fila = e.target; }
        while (Fila.id != this._element.id) { Fila = Fila.parentNode };
        if (Fila.__Orden < this.UltimaFila) {
            var Salto = Fila[this.IndiceElemento] - this.FilaAnterior[this.IndiceElemento];
            if (Salto != 0) { this.Datos.Avanzar({ Salto: Salto }) } else { this.Datos.Retroceder({ Salto: -Salto }) };
            this.FilaAnterior.className = this.ClaseFila;
            Fila.className = "Seleccionado";
            this.FilaAnterior = Fila;
            this.InvocarSeleccionado()
        }
    },
    SeleccionarPrimero: function() {
        this.FilaAnterior.className = this.ClaseFila;
        this.FilaAnterior = this.get_element();
        this.Seleccionar({ target: this.FilaAnterior })
    },

    Ruedita: function(e) {
        if (!this.Datos.Esperando) {
            var Delta = e.rawEvent.wheelDelta || (e.rawEvent.detail * (-1));
            if (Delta > 0) { this.Retroceder(1) } else { this.Avanzar(1); }
            this.Buscado = "";
            this.Buscar(this.Buscado);
            window.status = ""
        } else {
            window.status = "Esperando..."
        }
        e.preventDefault()

    },
    Teclado: function(e) {
        var Tecla = e.keyCode
        if (this.CeldasOrden.length > 0) {
            var SinValor = "-9-13-33-34-37-39-38-40-16-17-18-19-20-27-91-92-93-112-113-114-115-116-117-118-119-120-121-122-123-144-145"
            if (SinValor.indexOf("-" + Tecla + "-") == -1) {
                if (Tecla >= 96 && Tecla <= 105) { Tecla = Tecla - 48 };
                if (Tecla == 8) {
                    if (this.Buscado.length > 0) { this.Buscado = this.Buscado.substr(0, this.Buscado.length - 1) }
                } else { this.Buscado = this.Buscado + String.fromCharCode(Tecla) }
                if (!this.Datos.Esperando) {
                    this.Buscar(this.Buscado);
                }
            } else {
                if (Tecla != 9) {
                    this.Buscado = "";
                    this.Buscar(this.Buscado);
                } else {
                    return;
                }
            }
            e.preventDefault();
        }
        if (!this.Datos.Esperando) {
            if (Tecla == 40 || Tecla == 39) { //Abajo //Izquierda
                e.preventDefault();
                this.Avanzar(1);
            }
            if (Tecla == 38 || Tecla == 37) {//Arriba //Derecha
                e.preventDefault();
                this.Retroceder(1)
            }
            if (Tecla == 33) {//PgUp 
                e.preventDefault();
                this.Retroceder(this.Filas);
            }
            if (Tecla == 34) {//PgDown
                e.preventDefault();
                this.Avanzar(this.Filas);
            }
            if (Tecla == 13) {//Enter
                e.preventDefault();
                this.Elegir();
            }
            window.status = ""
        } else {
            window.status = "Esperando..."
        }


    },
    Buscar: function(pBuscado, pOrden) {
        if (pBuscado != "") {
            pOrden = (pOrden != undefined ? pOrden : this.Datos.IndiceActual);
            if (this.Flechita.parentNode != undefined) { this.Flechita.parentNode.removeChild(this.Flechita) };
            for (var Ind in this.CeldasOrden) {
                if (this.CeldasOrden[Ind].Indice == pOrden) {
                    this.CeldasOrden[Ind].appendChild(this.Flechita)
                }
            }
            this.DelEncontrado = Function.createDelegate(this, this.EncontradoBuscar);
            this.DelFin = Function.createDelegate(this, this.FinBuscar);
            this.Datos.add_Encontrado(this.DelEncontrado)
            this.Datos.add_Fin(this.DelFin)
            if (this.CeldaInfo != null) { this.CeldaInfo.innerHTML = "<div></div>" + pBuscado; }
            this.FilaAnterior.className = this.ClaseFila;
            this.FilaAnterior = this.get_element();
            this.Datos.Buscar({ Valor: pBuscado, Orden: pOrden });
        } else {
            if (this.CeldaInfo != null) { this.CeldaInfo.innerHTML = "" };
        }
    },
    EncontradoBuscar: function() {
        this.Datos.remove_Encontrado(this.DelEncontrado);
        this.Datos.remove_Fin(this.DelFin);
        var Puntero = this.Datos.Puntero;
        if (this.Datos.Indices[Puntero.Indice][Puntero.Pagina].P.length - Puntero.Registro < this.Filas) {
            if (this.Datos.Indices[Puntero.Indice].length > Puntero.Pagina + 1) {
                this.DelEncontrado = Function.createDelegate(this, this.EncontradoBuscar);
                this.Datos.add_Encontrado(this.DelEncontrado)
                this.Datos.Arribar({ Pagina: Puntero.Pagina + 1 });
            } else { // Final de la tabla

                this.Poblar();
                this.InvocarEncontrado()
                this.Seleccionar({ target: this.get_element() })
            }
        } else {
            this.Poblar();
            this.InvocarEncontrado()
            this.Seleccionar({ target: this.get_element() })
        }
    },
    FinBuscar: function() {
        this.Datos.remove_Encontrado(this.DelEncontrado);
        this.Datos.remove_Fin(this.DelFin);
        this.Poblar();
        this.InvocarEncontrado()
        this.Seleccionar({ target: this.get_element() })
    },

    InvocarEncontrado: function() {
        var e = new this.EncontradoArgs(this.Datos.Registro);
        var h = this.get_events().getHandler('Encontrado');
        if (h) {
            h(this, e)
        }

    },

    Elegir: function() {
        var e = new this.ElegidoArgs(this.Datos.Registro);
        var h = this.get_events().getHandler('Elegido');
        if (h) { h(this, e) }
    },

    InvocarSeleccionado: function() {
        var e = new this.SeleccionadoArgs(this.Datos.Registro);
        var h = this.get_events().getHandler('Seleccionado');
        if (h) {
            h(this, e)
        }
    },
    get_Filas: function() {
        return this.Filas;
    },

    set_Filas: function(value) {
        if (this.Filas !== value) {
            this.Filas = value;
            this.raisePropertyChanged('Filas');
        }
    },

    get_CeldaScroll: function() {
        return this.CeldaScroll;
    },

    set_CeldaScroll: function(value) {
        if (typeof value != Object) {
            value = document.getElementById(value);
        }
        if (this.CeldaScroll !== value) {
            this.CeldaScroll = value;
            this.raisePropertyChanged('CeldaScroll');
        }
    },

    get_CeldaInfo: function() {
        return this.CeldaInfo;
    },

    set_CeldaInfo: function(value) {
        if (typeof value != Object) {
            value = document.getElementById(value);
        }
        if (this.CeldaInfo !== value) {
            this.CeldaInfo = value;
            this.raisePropertyChanged('CeldaInfo');
        }
    },

    get_IDDatos: function() {
        return this.IDDatos;
    },

    set_IDDatos: function(value) {
        if (this.IDDatos !== value) {
            this.IDDatos = value
            this.raisePropertyChanged('IDDatos')
        }
    },
    add_ControlCreado: function(handler) {
        this.get_events().addHandler('ControlCreado', handler);
    },
    remove_ControlCreado: function(handler) {
        this.get_events().removeHandler('ControlCreado', handler);
    },
    add_FilaCreada: function(handler) {
        this.get_events().addHandler('FilaCreada', handler);
    },
    remove_FilaCreada: function(handler) {
        this.get_events().removeHandler('FilaCreada', handler);
    },
    add_Poblando: function(handler) {
        this.get_events().addHandler('Poblando', handler);
    },
    remove_Poblando: function(handler) {
        this.get_events().removeHandler('Poblando', handler);
    },
    add_Elegido: function(handler) {
        this.get_events().addHandler('Elegido', handler);
    },
    remove_Elegido: function(handler) {
        this.get_events().removeHandler('Elegido', handler);
    },
    add_Seleccionado: function(handler) {
        this.get_events().addHandler('Seleccionado', handler);
    },
    remove_Seleccionado: function(handler) {
        this.get_events().removeHandler('Seleccionado', handler);
    },
    add_Encontrado: function(handler) {
        this.get_events().addHandler('Encontrado', handler);
    },
    remove_Encontrado: function(handler) {
        this.get_events().removeHandler('Encontrado', handler);
    }
}

MoniMisi2.Grilla.registerClass('MoniMisi2.Grilla', Sys.UI.Behavior);
if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();